package com.yusvn.scm.admin.auth;

import com.jfinal.aop.Inject;
import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
import com.jfinal.core.Controller;
import com.yusvn.scm.admin.service.LoginService;
import com.yusvn.scm.common.constant.Const;
import com.yusvn.scm.common.kit.RetKit;
import com.yusvn.scm.common.model.SysUser;

/**
 * 管理后台授权拦截器
 * @author liugz
 * 
 */
public class AdminAuthInterceptor implements Interceptor {
	
	@Inject
	AdminAuthService srv;
	
	@Inject
	LoginService loginSrv;
	
	/**
	 * 用于 sharedObject、sharedMethod 扩展中使用
	 */
	private static final ThreadLocal<SysUser> threadLocal = new ThreadLocal<SysUser>();
	
	public static SysUser getThreadLocalAccount() {
		return threadLocal.get();
	}
	
	@Override
	public void intercept(Invocation inv) {
		Controller ctl = inv.getController();
		String sessionId = ctl.getHeader(Const.TOKEN_HEADER_NAME);
		
		SysUser loginUser = loginSrv.loginWithSessionId(sessionId, ctl.getRequest());
		if (loginUser != null && loginUser.isStateOk()) {
			// 传递给 sharedObject、sharedMethod 扩展使用
			threadLocal.set(loginUser);
			
			//System.out.println(" 授权拦截器getActionKey():"+inv.getActionKey());
			String actionKey = inv.getActionKey();
			//暂时截取菜单权限/后面的字符，即不控制按钮级别的权限
			actionKey = actionKey.substring(0,actionKey.lastIndexOf("/")).replaceFirst("/api/", "/");
			//System.out.println(" --actionKey:"+actionKey);
			
			// 如果是超级管理员或者拥有对当前 action 的访问权限则放行
			if (srv.isSuperAdmin(loginUser.getUserId()) ||
				srv.hasPermission(loginUser.getUserId(), actionKey)) {
				
				inv.invoke();
				return ;
			}
		}
		
		// renderError(404) 避免暴露后台管理 url，增加安全性
		if (loginUser == null ) {
			inv.getController().renderJson(RetKit.fail("无效用户信息"));
		}
		// renderJson 提示没有操作权限，提升用户体验
		else {
			inv.getController().renderJson(RetKit.fail("没有操作权限"));
		}
	}
	
}
